/**
 * M1 MIAGE APP - INF1
 * Cédric Hulin
 * Julien Trébern
 */
package vue;

import java.awt.event.ActionListener;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * IHM de l'interpréteur
 */
public class InterpreteurView extends JFrame {

    /*
     * Menu
     */
    private JMenuBar menuBar;
    private JMenu menu, submenu;
    private JMenuItem menuNouveau, menuCharger, menuEnregistrer, menuEnregistrerSous;
    /*
     * Les panels 
     */
    private JPanel panel1, panel2;
    /*
     * Les boutons
     */
    private JButton boutonCharger, boutonNotation, boutonSave, boutonInterpreter;
    public JTextArea textArea, console;
    /*
     * Scrollpane et area
     */
    JScrollPane scrollPane, scrollPaneConsole;

    /**
     * Constructeur normal
     */
    public InterpreteurView() {

        // Window
        Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        double largeur = tailleEcran.getWidth();
        double hauteur = tailleEcran.getHeight();
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        Insets I = Toolkit.getDefaultToolkit().getScreenInsets(gc);

        setSize((int) largeur * 3 / 4, (int) hauteur - (I.bottom + 20));
        setLocation((int) (largeur - getWidth()) / 2, 0);


        setResizable(false);
        this.setTitle("Interpréteur PicoL");
        this.setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel1 = new JPanel(new GridBagLayout());
        panel2 = new JPanel(new BorderLayout());

        // Création du menu et des items
        menuBar = new JMenuBar();
        menu = new JMenu("Fichier");
        menuNouveau = new JMenuItem("Nouveau");
        menuCharger = new JMenuItem("Charger");
        menuEnregistrer = new JMenuItem("Sauvegarder vers");
        menuEnregistrerSous = new JMenuItem("Sauvegarder");

        menu.add(menuNouveau);
        menu.add(menuCharger);
        menu.add(menuEnregistrer);
        menu.add(menuEnregistrerSous);

        menuBar.add(menu);

        this.setJMenuBar(menuBar);

        // Boutons
        boutonInterpreter = new JButton("Exécuter");
        boutonInterpreter.setIcon(new ImageIcon("img/run.png"));
        boutonNotation = new JButton("Notation explorateur");
        boutonNotation.setIcon(new ImageIcon("img/arbo.png"));
        griserBoutons(true);

        // Texte
        textArea = new JTextArea("", 25, 50);
        console = new JTextArea("Ouverture de l'IDE", 10, 50);
        scrollPane = new JScrollPane(textArea);
        scrollPaneConsole = new JScrollPane(console);
        console.setEnabled(false);
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 2;
        c.gridy = 0;
        panel1.add(boutonInterpreter, c);
        c.gridx = 3;
        c.gridy = 0;
        panel1.add(boutonNotation, c);
        panel2.add(scrollPane, BorderLayout.NORTH);
        panel2.add(scrollPaneConsole, BorderLayout.CENTER);
        console.setBackground(Color.BLACK);
        this.add(panel1, BorderLayout.NORTH);
        this.add(panel2, BorderLayout.CENTER);
    }

    /**
     * Abonnement des composants au controleur
     */
    public void interpreteurListenerAbonnement(ActionListener listener) {
        menuNouveau.addActionListener(listener);
        menuCharger.addActionListener(listener);
        menuEnregistrer.addActionListener(listener);
        menuEnregistrerSous.addActionListener(listener);
        boutonInterpreter.addActionListener(listener);
        boutonNotation.addActionListener(listener);
    }

    /**
     * Abonnement d'un controleur sur le composant central.
     * 
     */
    public void windowControlerAbonnement(WindowListener listener) {
        addWindowListener(listener);
    }

    public void griserBoutons(boolean bool) {
        this.boutonInterpreter.setEnabled(!bool);
        this.boutonNotation.setEnabled(!bool);

    }

    /**
     * Méthode de display de la fenêtre
     */
    public void display() {
        this.setVisible(true);
    }

    public void setText(String text) {
        textArea.setText(text);
    }

    public String getText() {
        return textArea.getText();
    }

    public void setConsole(String text) {
        console.setText(text);
    }

    /**
     * Affiche une erreur levée dans le controlleur
     * 
     * @param erreur
     *            L'erreur à afficher
     */
    public void afficherErreur(String erreur) {
        JOptionPane.showMessageDialog(this, erreur, "Erreur",
                                      JOptionPane.ERROR_MESSAGE);
    }

    public boolean demanderConfirmation(String warning) {
        int resultat = JOptionPane.showConfirmDialog(this, warning, "Warning",
                                                     JOptionPane.INFORMATION_MESSAGE);
        if (resultat == JOptionPane.YES_OPTION) {
            return true;
        }
        return false;
    }

    public Object demanderValeur() {
        try {
            return Integer.valueOf(JOptionPane.showInputDialog(null, "Veuillez entrer une valeur entiere", "READ",
                                                               JOptionPane.INFORMATION_MESSAGE));
        }
        catch (Exception ex) {
            return new RuntimeException("Valeur non entier");
        }
    }
}